package com.example.aop;

import com.example.log.Log;
import com.example.mapper.OperateLogMapper;
import com.example.pojo.OperateLog;
import com.example.utils.CurrentHolder;
import lombok.extern.slf4j.Slf4j;
import org.apache.tomcat.util.http.parser.HttpHeaderParser;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;

/**
 * OperationLogAspect 类的描述信息
 *
 * @author 12427
 * @since 2025/6/9 10:42
 */
@Aspect//声明是切面
@Component
@Slf4j
public class OperationLogAspect {
    //    通过注释的方法  获得切入面  在方法要 @Log 标明是要使用的切面
    private OperateLogMapper operateLogMapper;

    public OperationLogAspect(OperateLogMapper operateLogMapper) {//通过方法注入 mapper
        this.operateLogMapper = operateLogMapper;
    }

    @Around("@annotation(com.example.log.Log)")//获得全类名com.example.log.Log
    public Object LogOpertion(ProceedingJoinPoint pj) throws Throwable {
//        计算开始时间
        long startTime = System.currentTimeMillis();

        Object proceed = pj.proceed();//执行原方法
//      结束时间
        long end = System.currentTimeMillis();
        long count = end - startTime;
//       构建日志
        OperateLog olog = new OperateLog();
        olog.setOperateEmpId(getempid());//获取对应的id(通过线程中的ThreadLocal  先设置在获取)
        olog.setOperateTime(LocalDateTime.now());//操作时间
        olog.setClassName(pj.getTarget().getClass().getName());//操作类名
        olog.setMethodName(pj.getSignature().getName());//操作方法名
        olog.setMethodParams(String.valueOf(pj.getArgs()));//操作方法参数
        olog.setReturnValue(proceed != null ? proceed.toString() : "void");//操作方法返回值
        olog.setCostTime(count);//总耗时
//        总耗时
        operateLogMapper.insert(olog);
        return proceed;
    }

    private Integer getempid() {
        return CurrentHolder.getCurrentId();
    }

}
